home *** CD-ROM | disk | FTP | other *** search
- # module getopt -- Standard command line processing.
-
- # Function getopt.getopt() has a different interface but provides the
- # similar functionality to the Unix getopt() function, with the
- # addition of long-option support. (Long option support added by Lars
- # Wirzenius <liw@iki.fi>.)
-
- # It has two required arguments: the first should be argv[1:] (it
- # doesn't want the script name), the second the string of option
- # letters as passed to Unix getopt() (i.e., a string of allowable
- # option letters, with options requiring an argument followed by a
- # colon).
-
- # The optional third argument, if present, getopt.getopt works similar
- # to the GNU getopt_long function (but optional arguments are not
- # supported). The third argument should be a list of strings that
- # name the long options. If the name ends '=', the argument requires
- # an argument.
-
- # It raises the exception getopt.error with a string argument if it
- # detects an error.
-
- # It returns two values:
- # (1) a list of pairs (option, option_argument) giving the options in
- # the order in which they were specified. (I'd use a dictionary
- # but applications may depend on option order or multiple
- # occurrences.) Boolean options have '' as option_argument.
- # (2) the list of remaining arguments (may be empty).
-
- import string
-
- error = 'getopt.error'
-
- def getopt(args, shortopts, longopts = []):
- list = []
- longopts = longopts[:]
- longopts.sort()
- while args and args[0][:1] == '-' and args[0] != '-':
- if args[0] == '--':
- args = args[1:]
- break
- if args[0][:2] == '--':
- list, args = do_longs(list, args[0][2:], longopts, args[1:])
- else:
- list, args = do_shorts(list, args[0][1:], shortopts, args[1:])
-
- return list, args
-
- def do_longs(list, opt, longopts, args):
- try:
- i = string.index(opt, '=')
- opt, optarg = opt[:i], opt[i+1:]
- except ValueError:
- optarg = None
-
- has_arg, opt = long_has_args(opt, longopts)
- if has_arg:
- if optarg is None:
- if not args:
- raise error, 'option --%s requires argument' % opt
- optarg, args = args[0], args[1:]
- elif optarg:
- raise error, 'option --%s must not have an argument' % opt
- list.append(('--' + opt, optarg or ''))
- return list, args
-
- # Return:
- # has_arg?
- # full option name
- def long_has_args(opt, longopts):
- optlen = len(opt)
- for i in range(len(longopts)):
- x, y = longopts[i][:optlen], longopts[i][optlen:]
- if opt != x:
- continue
- if y != '' and y != '=' and i+1 < len(longopts):
- if opt == longopts[i+1][:optlen]:
- raise error, 'option --%s not a unique prefix' % opt
- if longopts[i][-1:] in ('=', ):
- return 1, longopts[i][:-1]
- return 0, longopts[i]
- raise error, 'option --' + opt + ' not recognized'
-
- def do_shorts(list, optstring, shortopts, args):
- while optstring != '':
- opt, optstring = optstring[0], optstring[1:]
- if short_has_arg(opt, shortopts):
- if optstring == '':
- if not args:
- raise error, 'option -%s requires argument' % opt
- optstring, args = args[0], args[1:]
- optarg, optstring = optstring, ''
- else:
- optarg = ''
- list.append(('-' + opt, optarg))
- return list, args
-
- def short_has_arg(opt, shortopts):
- for i in range(len(shortopts)):
- if opt == shortopts[i] != ':':
- return shortopts[i+1:i+2] == ':'
- raise error, 'option -%s not recognized' % opt
-
- if __name__ == '__main__':
- import sys
- print getopt(sys.argv[1:], "a:b", ["alpha=", "beta"])
-